/* 
基础数据类型
1. boolean
2. number
3. string
4. null和undefined
5. 数组
6. 元组(Tuple) 
7. 枚举(enum)
8. any
9. void
10. object
*/

(function () {
  // 1. boolean
  let isDone: boolean = false
  isDone = true
  // isDone = 'abc' // error

  // 2. number
  let age: number = 4
  age = 12.34
  // age = true  // error

  // 3. string
  let name: string = 'atguigu'
  // name = 123  // error
  let info: string = `我叫${name}, 今年${age}`

  // 4. null和undefined   是任意类型的子类型 (在非严格模式下)
  let n: null = null // null类型只有一个值null
  // n = 123  // error
  let u: undefined = undefined // undefined类型也只有一个值undefined
  // u = 'abc' // error
  info = null
  info = undefined
  n = undefined

  // 5. 数组
  let arr: number[]= [1, 23/* , 'abc' */]
  let arr2: Array<string> = ['a', 'b'/* , 12 */]
  /* 
  function Array<T> () {
    push(T t)
  }
  */

  // 6. 元组(Tuple)  特别的数组, 数组元素个数和类型确定的
  let tuples: [string, number]
  tuples = [name, 12] 

  // 7. 枚举(enum)
  // 字符串枚举
  enum Status {
    padding = 'Padding',
    resolved = 'Resolved',
    rejected = 'Rejected'
  }

  let status: Status = Status.padding
  // status = 'abc'  // error 不能是枚举之外的值

  // 数值枚举
  enum Color {
    Red = 2,
    Yellow = 5,
    Blue
  }
  let color: Color = Color.Yellow
  // color = -1   // 数值枚举有问题: 变量可以为别的值

  console.log(Color)
  let cat = {
    name: 'tom',
    color: 1
  }

  switch (cat.color) {
    case Color.Red:
      console.log('我的猫是红色')
      break;
    case Color.Yellow:
      console.log('我的猫是黄色')
      break;
    case Color.Blue:
      console.log('我的猫是蓝色')
      break;
  
    default:
      break;
  }


  // 8. any   => 任意类型 不再有强类型的优势
  let a: any = 'true'
  a = 3
  a = true
  let arr3: any[] = [1, 'abc', true, () => {}]

  // 9. void: 任何类型都不是 => 用来表达函数没有返回值
  function fn(): void {
    // return 'abc'  // error
    // return null
    // return undefined
  }

  // 10. object
  function fn2(): object {
    // return {}
    // return () => {}
    // return []
    // return 1 // error
    // return null
    return undefined
  }
})()
